﻿#include "Snake.h"

//------------------------------- InitSnake -----------------------------------
// 뱀의 길이/위치/방향을 초기화해준다.
//-----------------------------------------------------------------------------
void Snake::InitSnake()
{
	//현재 뱀의 좌표값을 비운다.
	snake_trace_.clear();

	//초기뱀의 좌표를 넣어준다.
	//좌표는 항상 몸의길이 + 1만큼이 있어야한다.
	//그래야만 뱀이 마지막으로 지나간곳을 Snake_Game에서 지워줄 수 있다.
	snake_trace_.push_back(Position(7,5));
	snake_trace_.push_back(Position(6,5));
	snake_trace_.push_back(Position(5,5));
	snake_trace_.push_back(Position(4,5));

	active_ = true;
	current_position_ = Position(7,5);
	direction_ = RIGHT;
	length_ = 2;
	grow_goal_ = 0;
}

//-------------------------------- Update -------------------------------------
// 뱀의 방향대로 움직이고, 좌표를 흔적리스트에 넣어준다.
//-----------------------------------------------------------------------------
void Snake::Update()
{
	switch (direction_) 
	{

	case LEFT:
		current_position_.x_ --;
		break;

	case RIGHT:
		current_position_.x_ ++;
		break;

	case UP:
		current_position_.y_ --;
		break;

	case DOWN:
		current_position_.y_ ++;
		break;
	}

	//좌표를 기억한다.
	snake_trace_.push_front(current_position_);

	//뱀이 자라고 있는중이면 좌표를 빼지않는다.
	if(this->IsGrowing() == false)
	{
		snake_trace_.pop_back();
	}

	this->IsCollide();
}

//--------------------------------- Render ------------------------------------
// 뱀을 그린다.
//-----------------------------------------------------------------------------
void Snake::Render()
{
	for(Snake::SNAKE_TRACE::iterator it = snake_trace_.begin(); it != snake_trace_.end(); it++)
	{
		DrawObject((*it),'#');
	}

	//맨뒤는 ' '로 지워준다.
	//이작업을 안한다면 흔적에는 없으나 화면에는 계속 뱀의 흔적이 보인다.
	//만약 전체 화면을 지우고 다시 그리는 작업을 하면
	//화면이 깜빡이는 현상이 일어난다.
	DrawObject(snake_trace_.back(),' ');

	//현재위치에는 뱀의 머리를 그려준다.
	DrawObject(current_position_,'S');
}

//--------------------------------- Input -------------------------------------
// 키를 받아온다.
//-----------------------------------------------------------------------------
void Snake::Input(char key)
{
	switch(key)
	{
		case LEFT:
			if (this->GetDirection() != RIGHT) this->SetDirection(LEFT);
			break;
		case RIGHT:
			if (this->GetDirection() != LEFT) this->SetDirection(RIGHT);
			break;
		case UP:
			if (this->GetDirection() != DOWN) this->SetDirection(UP);
			break;
		case DOWN:
			if (this->GetDirection() != UP) this->SetDirection(DOWN);
			break;
	}
}


//------------------------------- IsCollide -----------------------------------
// 충돌확인 함수
//-----------------------------------------------------------------------------
void Snake::IsCollide()
{
	//현재 위치의 값을 dummy에 집어넣는다.
	int dummy = Getchon(current_position_);

	//만약 더미의 위치가 비어있지 않다면,
	if(dummy != ' ')
	{
		if(dummy == 'M' || dummy == '#')
		{
			active_ = false;
		}
		//아니라면 아이템을 먹은것이다.
		else
		{
			//dummy는 char형이기 떄문에
			//int로 바꾸기위해 49를 빼준다.
			grow_goal_ = dummy-49;
			eat_num_counter_++;
		}
	}
}

//------------------------------- IsGrowing -----------------------------------
// 뱀이 현재 커지고 있는지 확인한다.
//-----------------------------------------------------------------------------
bool Snake::IsGrowing()
{
	//grow_goal이 0보다 작다면 크고있지 않다는것이다.
	//만약 크고있다면 1프레임당 몸을 1씩 늘리고,
	//grow_goal을 1 감소 시킨다.
	if(grow_goal_ < 0)
	{
		return false;
	}
	else
	{
		grow_goal_--;
		length_++;
	}

	return true;
}